#ifndef _Matrix_H_
#define _Matrix_H_
class Matrix
{
public:
    struct Pixel
    {
        unsigned char red;
        unsigned char gre;
        unsigned char blu;
    };

    Matrix();//w
    Matrix(int h,int w);//w
    Matrix(int h, int w, Pixel val);//w
    Matrix(const Matrix &m);//w
    virtual ~Matrix();//w

    void ReadText(const char* filename); //w 从文本文件中读入矩阵数据;
    void WriteText(const char* filename); //w 将矩阵数据保存为文本文件;
    void Zeros(int h, int w); //w  根据参数产生h行w列的全零矩阵
    void Ones(int h, int w); //w 根据参数产生h行w列的全1矩阵
    //void Random(int h, int w); //w 产生h行w列的随机矩阵，矩阵的元素为[0,1]之间的随机实数（Pixel类型）
    void Identity(int n); // 根据参数产生n行n列的单位矩阵

    int Height() const;  //w 获得矩阵的行数
    int Width() const;   //w 获得矩阵的列数
    Matrix MajorDiagonal();//w 求矩阵主对角线上的元素，输出一个N行1列的矩阵，N为主对角线元素的个数
    Matrix MinorDiagonal();//w 求矩阵的副对角线上的元素，输出一个N行1列的矩阵，N为副对角线上元素的个数
    Matrix Row(int n);//w 返回矩阵的第n行上的元素，组出一个1行N列的矩阵输出，N为第n行上元素的个数
    Matrix Column(int n);//w 返回矩阵的第n列上的元素，组出一个N行1列的矩阵输出，N为第n列上元素的个数

    void Transpose(); //w 将矩阵转置

    Pixel& At(int row, int col); //w获取第row行第col列的矩阵元素的值
    Pixel At(int row, int col) const;//w
    void Set(int row, int col, Pixel pix); //w 设置第row行第col列矩阵元素的值为pix(行列均从0开始)
    void Set(Pixel pix); //w 设置矩阵所有元素为同一值value

    //virtual void Normalize(); // 该函数把矩阵的数据线性缩放至[0,1]区间，即把当前矩阵所有元素中的最小值min变成0，最大值max变为1，其他元素的值线性变到[0,1]区间，公式为：t’=(t-min)/max，注意除零情况、矩阵数据相同情况的处理;

    void Reshape(int h, int w); //w 在矩阵元素总数不变的情况下，将矩阵行列变为参数给定的大小
    bool IsEmpty();//w 判断矩阵是否为空矩阵，是返回true 不是返回false
    bool IsSquare();//w 判断矩阵是否为方阵
    void CopyTo(Matrix &m);//w 将矩阵复制给m
    //void Mult(Pixel s); // 矩阵的每个元素都乘以参数s
    void Cat(Matrix &m, int code);//w 将矩阵m与当前矩阵进行拼接，code代表拼接的方式：将m拼接到当前矩阵的上、下、左、右，具体例子见本大纲后面的说明

    //friend Matrix Add(const Matrix &m1, const Matrix &m2); // 友元函数，将矩阵m1和m2相加，结果矩阵作为函数的返回值
    //friend Matrix Sub(const Matrix &m1, const Matrix &m2); // 友元函数，将矩阵m1和m2相减，结果矩阵作为函数的返回值
    friend void Swap(Matrix &a, Matrix &b); // 友元函数，交换两个矩阵




    Matrix& operator=(const Matrix &m);  //w重载赋值运算符，完成对象间的深拷贝；
    Matrix& operator=( Pixel pix);//w
    bool operator==(const Matrix &m);//w 判断两个Matrix对象是否相等

    virtual Matrix& operator++();  //w 前置自加；!!!!
    virtual Matrix& operator--();  //w 前置自减；!!!!
    Matrix operator++(int);  //w 后置自加；
    Matrix operator--(int);  //w 后置自减；
private:
    int height;
    int width;
    Pixel **data;
    void init(long h,long w);//w
    void del();//w
};

typedef Matrix::Pixel Pixel;
#endif
